您好,欢迎来到达州工业云! 平台首页 企业驾驶舱 帮助中心 企业登录 企业注册

HI,欢迎使用达州工业云平台!

账号必须大于2位

创新资源平台
服务平台首页>专利库>专利详情

Linux内核镜像数据支持多种CPU的实现方法及装置

  • 申请号:CN200910039620.5 申请公布号: CN101894028A
  • 申请日: 2009-05-20 申请公布日: 2010-11-24
  • 申请(专利权)人: 专利代理机构: 广州三环专利代理有限公司
  • 分类号:G06F9/445;G06F17/30

专利介绍

本发明提供一种Linux内核镜像数据支持多种CPU的实现方法及装置,其中方法包括:预先设置存储索引信息,所述存储索引信息用于查找到多种CPU能够共用的Linux内核镜像数据;预设每种CPU的识别信息;读取待运行的CPU的识别信息,对该CPU做识别处理;并根据所述存储索引信息,查找到适用于该CPU的Linux内核镜像数据,且在该CPU上运行所述Linux内核镜像数据。本发明提供的技术方案有效解决现有技术中存在的Linux内核镜像数据难以支持多种CPU,难以适应嵌入式设备硬件差异的多样性和复杂性的技术问题,让ARM平台的Linux嵌入式系统具有更好的移植性和硬件兼容性。
1.一种Linux内核镜像数据支持多种CPU的实现方法,其特征在于,包括:预先设置存储索引信息,所述存储索引信息用于查找到多种CPU能够共用的Linux内核镜像数据;预设每种CPU的识别信息;读取待运行的CPU的识别信息,对该CPU做识别处理;并根据所述存储索引信息,查找到适用于该CPU的Linux内核镜像数据,且在该CPU上运行所述Linux内核镜像数据。
2.根据权利要求1所述的方法,其特征在于,所述对该CPU做识别处理包括:根据该CPU的识别信息,确定用于存放待运行于该CPU上的Linux内核镜像数据的解压目标地址;根据该CPU的识别信息,获取与所运行的该CPU相匹配的初始化数据。
3.根据权利要求2所述的方法,其特征在于,所述Linux内核镜像数据携带CPU驱动模块;所述对该CPU做识别处理还包括:所述CPU驱动模块根据该CPU的识别信息,判断是否与该CPU相匹配,若是,则执行在该CPU上运行所述Linux内核镜像数据的操作,否则,结束流程。
4.根据权利要求1至3中任一项所述的方法,其特征在于,所述预先设置存储索引信息包括:在Linux内核源代码树中包含各个独立ARM硬件平台的代码目录区设置通用ARM平台目录;所述通用ARM硬件平台目录用于存放通用ARM硬件平台所需要的Linux内核镜像数据;在Linux内核源代码树中包含各独立ARMxa0CPU平台头文件的目录区设置通用ARM平台头文件目录;所述ARM平台头文件目录用于存放所有需要支持的ARMxa0CPU通用头文件;在所述通用ARM平台头文件目录中,根据不同的ARMxa0CPU设置用于存放该ARMxa0CPU的头文件的目录。
5.根据权利要求4所述的方法,其特征在于,所述预设存储索引信息还包括:在所述通用ARM平台目录中,根据不同的CPU设置用于保存与各ARMCPU相关的初始化及核心代码的目录;设置各ARMxa0CPU平台都需要使用且与各ARMxa0CPU平台相关的公用变量、函数及宏定义等指针化或变量化。
6.一种Linux内核镜像数据支持多种CPU的实现装置,其特征在于,包括:存储单元,用于存储多种CPU能够共用的Linux内核镜像数据;识别处理单元,用于读取待运行的CPU的识别信息,对该CPU做识别处理;并根据预设的用于查找存储单元内的所述Linux内核镜像数据的存储索引信息,查找到适用于该CPU的Linux内核镜像数据,且在该CPU上运行所述Linux内核镜像数据。
7.根据权利要求6所述的方法,其特征在于,所述识别处理单元包括:地址选择单元和初始化单元;所述地址选择单元,用于根据该CPU的识别信息,确定用于存放待运行于该CPU上的Linux内核镜像数据的解压目标地址;所述存储单元,还存储与各种CPU相关的初始化数据;所述初始化单元,根据该CPU的识别信息以及所述存储索引信息,从所述存储单元内获取与所运行的该CPU相匹配的初始化数据。
8.根据权利要求7所述的方法,其特征在于,所述识别处理单元还包括:CPU驱动模块;用于根据该CPU的识别信息,判断是否与该CPU相匹配,得到判断结果;执行单元,用于根据所述判断结果为是,执行在该CPU上运行所述Linux内核镜像数据的操作,否则,结束操作。技术领域
本发明涉及信息技术领域,尤其涉及一种Linux内核镜像支持多种CPU的实现方法及装置。
背景技术
通常,ARM(Advancedxa0RISCxa0Machines)平台的嵌入式Linux内核(Kernel)数据在编译完成后,得到的Linux内核镜象数据只适用于一种CPU硬件平台,难以适用于多种CPU。发明人发现:现有Linux内核镜象数据难以适用于硬件平台的接口电路及外围器件的不同的应用场景;对于具有相同ARM核的CPU,不同厂商制造的ARMxa0CPU,其初始化过程不同,现有Linux内核镜象同样难以适用。因此,现有Linux内核镜象数据由于通常针对特定的CPU设置而成,而难以应对嵌入式设备硬件差异的多样性和复杂性,也使得现有ARMxa0Linux嵌入式设备如智能手机、个人数码助理(PDA)等,难以像个人计算机(PC机)一样,为用户提高统一的用户操作系统,一些情况下给用户造成不便,用户体验不高。并且若该CPU相关环境如硬件电路或外围器件发生改变,则该Linux内核镜像数据将不再适用。
发明内容
本发明提供一种Linux内核镜像数据支持多种CPU的实现方法,解决现有技术中存在的Linux内核镜像数据难以支持多种CPU的技术问题。为解决上述技术问题,本发明提供一种ARMxa0Linux支持多种CPU的实现方法,包括:预先设置存储索引信息,所述存储索引信息用于查找到多种CPU能够共用的Linux内核镜像数据;预设每种CPU的识别信息;读取待运行的CPU的识别信息,对该CPU做识别处理;并根据所述存储索引信息,查找到适用于该CPU的Linux内核镜像数据,且在该CPU上运行所述Linux内核镜像数据。其中,所述对该CPU做识别处理可包括:根据该CPU的识别信息,确定用于存放待运行于该CPU上的Linux内核镜像数据的解压目标地址;根据该CPU的识别信息,获取与所运行的该CPU相匹配的初始化数据。其中,所述Linux内核镜像数据携带CPU驱动模块;所述对该CPU做识别处理还包括:所述CPU驱动模块根据该CPU的识别信息,判断是否与该CPU相匹配,,若是,则执行在该CPU上运行所述Linux内核镜像数据的操作,否则,结束流程。其中,所述预先设置存储索引信息可包括:在Linux内核源代码树中包含各个独立ARM硬件平台的代码目录区设置通用ARM平台目录;所述通用ARM硬件平台目录用于存放通用ARM硬件平台所需要的Linux内核镜像数据;在Linux内核源代码树中包含各独立ARMxa0CPU平台头文件的目录区设置通用ARM平台头文件目录;所述ARM平台头文件目录用于存放所有需要支持的ARMxa0CPU通用头文件;在所述通用ARM平台头文件目录中,根据不同的ARMxa0CPU设置用于存放该ARMxa0CPU的头文件的目录。其中,所述预设存储索引信息还包括:在所述通用ARM平台目录中,根据不同的CPU设置用于保存与各ARMCPU相关的初始化及核心代码的目录;设置各ARMxa0CPU平台都需要使用且与各ARMxa0CPU平台相关的公用变量、函数及宏定义等指针化或变量化。为解决上述技术问题,本发明还提供一种Linux内核镜像数据支持多种CPU的实现装置,其包括:存储单元,用于存储多种CPU能够共用的Linux内核镜像数据;识别处理单元,用于读取待运行的CPU的识别信息,对该CPU做识别处理;并根据预设的用于查找存储单元内的所述Linux内核镜像数据的存储索引信息,查找到适用于该CPU的Linux内核镜像数据,且在该CPU上运行所述Linux内核镜像数据。其中,所述识别处理单元包括:地址选择单元和初始化单元;所述地址选择单元,用于根据该CPU的识别信息,确定用于存放待运行于该CPU上的Linux内核镜像数据的解压目标地址;所述存储单元,还存储与各种CPU相关的初始化数据;所述初始化单元,根据该CPU的识别信息以及所述存储索引信息,从所述存储单元内获取与所运行的该CPU相匹配的初始化数据。优选地,所述识别处理单元还包括:CPU驱动模块;用于根据该CPU的识别信息,判断是否与该CPU相匹配,得到判断结果;执行单元,用于根据所述判断结果为是,执行在该CPU上运行所述Linux内核镜像数据的操作,否则,结束操作。相比较现有技术,本发明提供的技术方案存在以下有益技术效果:本发明提供的技术方案,通过设置存储索引信息,提供多种CPU能够共用的Linux内核镜像数据;并且通过对不同的CPU做识别处理,获取到适用于该CPU的Linux内核镜像数据,从而实现ARM平台的Linux内核镜像数据对多种CPU的支持,有效解决现有技术中存在的Linux内核镜像数据难以支持多种CPU,难以适应嵌入式设备硬件差异的多样性和复杂性的技术问题,让ARM平台的Linux嵌入式系统具有更好的移植性和硬件兼容性;并能够实现为用户提供统一的操作系统,提高用户体验。本发明提供ARMxa0Linux内核的平台移植技术,移植完成的Linux内核实用于以ARM9及更高版本的ARM核的CPU嵌入式Linux(非uCLinux)系统应用设备,如PDA、智能手机及其它各种应用Linux系统的设备。
附图说明
图1是现有Linux内核源代码树与各ARMxa0CPU平台之间的关系示意图;图2是本发明的实施例中ARMxa0Linux支持多种CPU的实现方法流程图;图3是本发明的实施例中Linux内核源代码树与各ARMxa0CPU平台之间的关系示意图;图4是本发明的实施例中对CPU的识别处理流程图;图5是本发明的实施例中ARMxa0Linux支持多种CPU的实现装置。
具体实施方式
本发明提供使ARMxa0Linux能够适用于多种CPU的技术方案,从而有效提高Linux内核镜像的兼容性。发明人首先分析现有Linux内核镜像技术如下:现有ARMxa0Linux源代码以开发板为依据组织,不同开发板在Linux内核源代码树中有相对独立的源代码支持,在将Linux源代码编译成二进制内核镜象时,只有与该开发板相关的代码参与编译,而其它ARM平台的代码并不参与编译过程。每种开发板一般是为某一型号的CPU而专门开发的,它保证编译得到的内核镜像在该开发板上的正常工作,但不保证该内核镜象能在其它的硬件平台上也能正常工作,甚至不保证为这套开发板维护的内核代码树能成功编译出其它开发板的内核镜像。与开发板相关的头文件及部分关健的公用代码也以开发板为依据分类,不同的开发板为内核环境定义不同的参数值,使编译得到的内核镜象只适用于该开发板。参见图1,图1是现有Linux内核源代码树与各ARMxa0CPU平台之间的关系示意图。图1中,Linux内核支持的ARM开发板与ARMxa0CPU成一一对应关系,这样的结构使得编译出的内核镜象与ARMxa0CPU也是成一一对应关系,难以达到同一内核镜象同时支持多种CPU的目的。下面结合附图对本发明的技术方案做详细说明。参见图2,图2是本发明的实施例中ARMxa0Linux支持多种CPU的实现方法流程图,该流程可包括步骤:步骤201、预先设置存储索引信息,所述存储索引信息用于查找到多种CPU能够共用的Linux内核镜像数据;预设每种CPU的识别信息。本发明的实施例中,设置存储索引信息主要包括:在Linux内核源代码树中包含各个独立ARM硬件平台的C代码目录区设置新的目录,作为新的通用ARM平台目录,比如在arch/arm/目录下添加类似于mach-generic的目录,在此新的通用ARM硬件平台目录中存放通用ARM硬件平台所需要的公用代码即Linux内核镜像数据;在Linux内核源代码树中包含各独立ARMxa0CPU平台头文件的目录区设置新的通用ARM平台头文件目录,比如在include/asm-arm/目录中增加arch-generic目录,该目录作为通用ARM平台的头文件目录区,其中存放所有需要支持的ARMxa0CPU通用头文件;在新增的通用ARM平台头文件目录中,以不同的ARMxa0CPU设置新的目录,如pxa270,omap34xx等,其中包含有关该ARMxa0CPU的头文件。本发明的实施例中,设置存储索引信息还包括:在新增的通用ARM平台目录中,根据不同的CPU增加新的目录,如pxa270,omap34xx等,这些目录中保存与各ARMxa0CPU相关的初始化及核心代码;设置各ARMxa0CPU平台都需要使用但又与各ARMxa0CPU平台密切相关的公用变量、函数及宏定义等指针化或变量化,以便针对不同的ARMxa0CPU选择不同的函数或变量值。参见图3,图3是本发明的实施例中Linux内核源代码树与各ARMxa0CPU平台之间的关系示意图。本发明的实施例对Linux源代码结构进行了扩展,以支持新的ARM硬件平台,该硬件平台不同于现有的某一特定ARMxa0CPU平台只是支持某一种ARMxa0CPU,而是同时容纳多种不同ARMxa0CPU,并能根据需要选择Linux内核镜象是同时支持所有CPU还是只支持其中的某几种,设置灵活,方便实用。步骤202、读取待运行的CPU的识别信息,对该CPU做识别处理;并根据所述存储索引信息,查找到适用于该CPU的Linux内核镜像数据,且在该CPU上运行所述Linux内核镜像数据。本发明的实施例中,由于期望Linux内核镜像数据能够适用于多种CPU,因此需要对CPU做识别处理,如上所述,预先设置每种CPU的识别信息,如为不同的ARMxa0CPU设置唯一的架构识别号(Architecturexa0ID)。并且在终端设备的启动过程(BootLoader)即对CPU做识别处理,该识别处理主要包括:BootLoader将Architecturexa0ID号传递给压缩的内核镜象最前端的解压缩代码,在解压缩过程中对不同CPU的正确识别是让内核镜象能运行于不同ARMxa0CPU平台上的关键。原因是不同的ARMxa0CPU其SDRAM的片选地址是不同的,这也导致内核代码在不同的CPU平台上要求被加载到不同的物理内存目标地址,正确的目标地址是内核可以运行的关键。因此,在解压过程中需要根据不同的ARMxa0CPU平台动态确定内核镜象解压的目标内存地址。解压过程中需要根据BootLoader传入的Architecturexa0ID来识别ARMCPU,以此来确定内核的加载内存目标地址。进一步,内核运行过程中的CPU识别分为三个阶段:启用内存管理单元(MMU)之前、启用MMU之后和驱动模块对CPU的识别:启用MMU之前:代码运行进入内核后,在启动MMU功能之前,需要进行CPU及MMU的初始化。该过程与特定ARMxa0CPU密切相关,不同的ARMxa0CPU需要完全不同的初始化代码,因此,需要根据Architecturexa0ID正确识别CPU,以便动态选择正确的初始化代码,并将部分与CPU密切相关的参数传递给MMU启动后的内核代码;启用MMU之后:内核代码在启动MMU之后,还需要对内存、时钟、中断、外设接口等做很多初始化操作,对不同的ARMxa0CPU来说,这些过程也需要完全不同的代码执行,因此需要根据不同的CPU动态选择不同的初始化代码。另外,在这一阶段,还要根据不同的CPU初始化不同的环境参数值和函数指针等;驱动模块:驱动模块通常只是为某一种ARMxa0CPU平台编写,为了不使驱动模块在不适当的CPU平台上加载时产生错误操作而导致内核崩溃,驱动模块首先需要做的是识别CPU平台,只有适合的CPU平台上运行时才继续加载,否则安全退出。由于驱动模块一般只是为某一种ARMxa0CPU平台开发,不需要保证能在多个ARMxa0CPU平台上正常运行,但由于本发明的实施例中,通用ARMxa0Linux内核镜象可以运行在不同的ARMxa0CPU平台上,因此本发明的实施例中提供驱动模块对CPU的识别处理机制,使得携带该驱动的通用ARMxa0Linux内核镜象运行在某一ARMxa0CPU平台上时,驱动模块可以根据内核提供的相关信息来识别该ARMxa0CPU平台是不是该驱动模块所针对的可以正常工作的平台,避免因驱动模块难以匹配CPU而引发的问题,如内核的崩溃,等。驱动模块在被加载初始化的最起始部分就需要通过内核提供的信息判断当前运行的ARMxa0CPU平台是不是合适的平台,以此决定是否应该被继续加载。为保证驱动模块实现上述机制,在Linux内核驱动模块标准开发规范基础上,针对该通用ARMxa0CPU平台环境扩展了以下形式的驱动模块开发规范,列举实例如下:指定驱动模块适用的ARMxa0CPU平台:在驱动模块源文件中,在开始包含任何头文件之前以下面的语句形式定义形如以下的合适的宏来表明该驱动模块适用于哪一种ARMxa0CPU平台:#define_ONLY_GENERIC_xxx_xa0xa0xa01其中的“xxx”部分是所匹配的CPU平台名称,如OMAP3、PXA27X等。这样可以使源代码能包含正确的适合该平台的头文件。包含正确的头文件:驱动模块在包含与平台硬件相关的头文件时的某些方法可能不再适用,需要根据对通用ARM平台头文件目录结构的扩展做适当调整。如,原来在驱动模块源文件中使用的类似于“asm/arch/xxx.h”包含头文件“xxx.h”的方式需要更改为类似于“asm/arch/yyyy/xxx.h”的形式,其中yyyy表示相对应的ARMxa0CPU平台目录名称,如pxa27x,omap34xx等。识别CPU以确定是否加载:首先需要在驱动模块的源文件中包含定义各ARMxa0CPU平台的Architecturexa0ID的头文件(例如Linuxxa0kernel2.6.25内核中的“asm/mach-types.h”),然后对驱动模块的入口函数及出口函数(如Linuxxa0kernel2.6中的用module_init和module_exit声明过的函数)进行如下修改:入口函数(如module_init声明函数)最开始开始加入类似以下功能的判断:if(_machine_arch_type!=MACH_TYPE_GENERIC_XXX){xa0xa0xa0xa0return-EINVAL;}其中“_machine_arch_type”代表存储于内核环境中的由BootLoader传入的该ARMCPU平台的ArchtitectureID值,“MACH_TYPE_GENERIC_XXX”用mach_types.h中定义的代表特定ARMCPU平台的名称代替。这样就可以保证该驱动模块在不适合的平台上不被加载。对于可以同时适合多种ARMxa0CPU平台的驱动模块,可以在上述条件判断中用“&&”连接类似对其它平台的不等式条件判断语句。为安全起见,在出口函数(如使用module_exit声明的函数)的最开始增加类似以下功能的判断:if(_machine_arch_typexa0!=MACH_TYPE_GENERIC_XXX){xa0xa0xa0xa0return;}其识别符代表的意义与驱动模块入口函数中的相同。参见图4,图4是本发明的实施例中对CPU的识别处理流程图,该流程中,BootLoader根据读取到的Architecturexa0ID,选择用于加载Linux内核镜像数据的目标地址,并选择正确的串口输出Linux内核镜像数据;之后,根据Architecturexa0ID选择适用于CPU的初始化代码、核心代码、内核环境参数等;之后,不同的驱动模块根据读取到的Architecturexa0ID,确定是否能够与该CPU相匹配,若匹配则加载Linux内核镜像数据;否则,可选择退出流程。参见图5,图5是本发明的实施例中ARMxa0Linux支持多种CPU的实现装置,该装置500可设置于终端设备内。装置500可包括:存储单元501,用于存储多种CPU能够共用的Linux内核镜像数据;识别处理单元502,用于读取待运行的CPU的识别信息,对该CPU做识别处理;并根据预设的用于查找存储单元501内的所述Linux内核镜像数据的存储索引信息,查找到适用于该CPU的Linux内核镜像数据,且在该CPU上运行所述Linux内核镜像数据。具体地,识别处理单元502包括:地址选择单元和初始化单元;所述地址选择单元,用于根据该CPU的识别信息,确定用于存放待运行于该CPU上的Linux内核镜像数据的解压目标地址;所述存储单元501,还存储与各种CPU相关的初始化数据;所述初始化单元,根据该CPU的识别信息以及所述存储索引信息,从所述存储单元501内获取与所运行的该CPU相匹配的初始化数据。识别处理单元502还包括:CPU驱动模块;用于根据该CPU的识别信息,判断是否与该CPU相匹配,得到判断结果;执行单元,用于根据所述判断结果为是,执行在该CPU上运行所述Linux内核镜像数据的操作,否则,结束操作。综上所述,本发明提供的技术方案,通过设置存储索引信息,提供多种CPU能够共用的Linux内核镜像数据;并且通过对不同的CPU做识别处理,获取到适用于该CPU的Linux内核镜像数据,从而实现ARMxa0Linux对多种CPU的支持,有效解决现有技术中存在的Linux内核镜像数据难以支持多种CPU,难以适应嵌入式设备硬件差异的多样性和复杂性的技术问题,让ARM平台的Linux嵌入式系统具有更好的移植性和硬件兼容性;并能够实现为用户提供统一的操作系统,提高用户体验。本发明提供ARMxa0Linux内核的平台移植技术,移植完成的Linux内核实用于以ARM9及更高版本的ARM核的CPU嵌入式Linux(非uCLinux)系统应用设备,如PDA、智能手机及其它各种应用Linux系统的设备。以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以作出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。